package models

import (
	"lottery/libs/mymgo"

	//"github.com/astaxie/beego/logs"
	"gopkg.in/mgo.v2"
	"gopkg.in/mgo.v2/bson"
)

const (
	GAMEDATA_COL_STR = "gamedata"
)

// 比赛数据
type GameData struct {
	Id             int64       `json:"id" bson:"_id"`                        // 自增ID
	PlatformId     int         `json:"platformId" bson:"platformId"`         // 站点ID
	GameId         int64       `json:"gameId" bson:"gameId"`                 // 比赛ID 内部系统赛事ID  //自己的ID
	PlatformGameId string      `json:"platformGameId" bson:"platformGameId"` // 比赛ID 站点比赛ID
	HandicapId     string      `json:"handicapId" bson:"handicapId"`         // 盘口ID (下单ID)
	Handicap       float64     `json:"handicap" bson:"handicap"`             // 盘口, 最小值加0.25
	HandicapType   int         `json:"handicapType" bson:"handicapType"`     // 盘口类型 1 全场让球盘 2 全场大小盘 3 半场让球盘 4 半场大小盘
	HOrderId       string      `json:"horderId" bson:"horderId"`             // 主场下单ID
	AOrderId       string      `json:"aorderId" bson:"aorderId"`             // 客场下单ID
	PreHRate       float64     `json:"preHRate" bson:"preHRate"`             // 主队赔率，上一次数据
	HRate          float64     `json:"hrate" bson:"hrate"`                   // 主队赔率
	HIndicator     int         `json:"hIndicator" bson:"hIndicator"`         // 主场大小球 1 大球 2 小球
	PreARate       float64     `json:"preARate" bson:"preARate"`             // 客队赔率，上一次数据
	ARate          float64     `json:"arate" bson:"arate"`                   // 客队赔率
	AIndicator     int         `json:"aIndicator" bson:"aIndicator"`         // 客场大小球 1 大球 2 小球
	HScore         int         `json:"hscore" bson:"hscore"`                 // 主队得分
	AScore         int         `json:"ascore" bson:"ascore"`                 // 客队得分
	ExtData        string      `json:"extData" bson:"extData"`               // 扩展数据
	UserId         int64       `json:"userId" bson:"userId"`                 // 用户数据单独存放
	AgentId        int64       `json:"agentId" bson:"agentId"`               // 代理ID
	LowPrice       int         `json:"lowPrice" bson:"lowPrice"`             // 最低限制
	HighPrice      int         `json:"highPrice" bson:"highPrice"`           // 高价
	HadUpdate      bool        `json:"hadUpdate" bson:"hadUpdate"`           // 是否有更新
	Game           *Game       `json:"-" bson:"-"`                           // 比赛
	GameTickData   interface{} `json:"-" bson:"-"`
	TriggerTime    int64       `json:"triggerTime" bson:"triggerTime"` // 触发时间 毫秒
	UpdateTime     int64       `json:"updateTime" bson:"updateTime"`   // 水位更新时间 毫秒
	CreateTime     int64       `json:"createTime" bson:"createTime"`   // 水位更新时间 毫秒
}

func (g *GameData) GetAgentId() int64 {
	return 0
}

func (g *GameData) FillGame() (err error) {
	sess, err := mymgo.OpenBase()
	game := new(Game)
	err = sess.WithC(GAME_COL_STR, func(col *mgo.Collection) error {
		return col.Find(bson.M{
			"platformId":     g.PlatformId,
			"platformGameId": g.PlatformGameId,
		}).Select(bson.M{"_id": 1}).One(game)
	})

	if err != nil {
		return
	}

	g.GameId = game.Id
	return
}

func UpsertGameData(gameData *GameData) (err error) {
	sess, err := mymgo.OpenBase()
	gameData.Id = int64(sess.AutoIncId(GAMEDATA_COL_STR))
	// gameData.CreateTime = time.Now().UnixNano() / int64(time.Millisecond)
	go sess.UpsertId(GAMEDATA_COL_STR, gameData.Id, gameData)
	return nil
}

func GetGameData(gameDataId int64) (gameData *GameData, err error) {
	sess, err := mymgo.OpenBase()
	if err != nil {
		return
	}

	//这里不能直接这样子取
	gameData = new(GameData)
	err = sess.FindId(GAMEDATA_COL_STR, gameDataId, gameData)
	return
}

func GetGameDataFromGameId(gameId int64, platformId int) (gameData *GameData, ok bool) {
	// sess, err := mymgo.OpenBase()
	// if err != nil {
	// 	return
	// }
	// times := time.Now().UnixNano() / int64(time.Millisecond)
	// //gameDatas := make([]*GameData, 0, 5)

	// //暂时取最新20秒内数据
	// //time_temp := time.Now().UnixNano()/int64(time.Millisecond) - 20*1000
	// gameData = new(GameData)
	// err = sess.WithC(GAMEDATA_COL_STR, func(col *mgo.Collection) error {
	// 	return col.Find(bson.M{"gameId": gameId}).One(&gameData)
	// })
	// // if len(gameDatas) > 0 {
	// // 	gameData = new(GameData)
	// // 	gameData = gameDatas[0]
	// // }
	// times = time.Now().UnixNano()/int64(time.Millisecond) - times
	// //logs.Debug("GetGameDataFromGameId", times)
	// return

	//从 服务层 gamedata读取数据
	gameData = new(GameData)
	ok = false
	return
}

// 策略
// 球队选择，盘口一致，比分一致，判断主队与客队赔率策略是否符合，符合，下单
// 多个相同盘口时，取第一个
